// 解题思路
// 使用 Set 维护窗口内的字符：
// set.has(s[right]) 判断是否有重复字符。
// set.add(s[right]) 将新字符加入窗口。
// 滑动窗口策略：
// 如果 s[right] 不在 set 中，则扩展窗口（right++），更新最大长度。
// 如果 s[right] 在 set 中，则收缩窗口（left++），直到 set 里没有 s[right]。
// 时间复杂度 O(n)：
// 每个字符最多被遍历 2 次（一次加入 set，一次移除 set），因此是线性复杂度。

var lengthOfLongestSubstring = function (s) {
    let left = 0, right = 0
    let maxLength = 0
    const set = new Set()
    while (right < s.length) {
        if (!set.has(s[right])) {
            set.add(s[right])
            maxLength = Math.max(maxLength, right - left + 1)
            right++
        } else {
            set.delete(s[left])
            left++
        }
    }
    return maxLength
};
const result = lengthOfLongestSubstring("abcabcbb")
console.log("🚀 ~ result:", result)
